package com.wqm.step.pojo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 * Hibernate指定实体类
 * JPA注解完成实体类配置映射
 * @author Administrator
 *
 */

@Entity // 必须定义实体，用于表示该类与数据库中的包关联，这是java提供的接口，由hibernate实现
// name 指定表名， catelog 指定数据库的名称
/** 注意！！！！！： 配置文件的编写有两种可能：(相同点：column用于指定字段名，当不配置时，默认类的属性名与字段名一致) 
 * 1. 数据库的表已经创建 当数据库的表已经创建好了，配置字段与属性对应关系时，
 * 可以只配置name,其他不用配置length和type会自动匹配数据(就算定义了也是以数据库类型为准) 
 * 2. 数据库的表使用hibernate自动创建 (要开启hibernate.cfg.xml中的<property name="hibernate.hbm2ddl.auto">update</property>自动建表/更新表，
 * 但是只能添加) 当数据库的表未创建或未创建完全，也可以只配置name属性，type默认为实体类中的类型，不过为了优化数据库可以配置上length，否则默认为255 -->
 * 配置实体类与字段对应关系 name :实体类的全名 table :表的名称(可以省略，默认表名称与类名称一致) catelog：数据库名称(可以省略，默认参考hibernate.cfg.xml中连接的数据名) */
@Table(name = "person")
public class Person {

	//  例：
	
	// @GeneratedValue // 定义主键的生成策略 ， 默认为 native，意思是根据底层数据库自动选择
	// 使用下面方法自定义主键生成策略
	/**@GeneratedValue(strategy = GenerationType.IDENTITY)可选
	 * 
	Hibernate中定义的主键类型包括：自然主键和代理主键： 
		自然主键：具有业务含义 字段 作为主键，比如：学号、身份证号
		代理主键：不具有业务含义 字段作为主键（例如 自增id），比如：mysql自增主键，oracle序列生成的主键、uuid()方法生成的唯一序列串
	建议：企业开发中使用代理主键！
	increment 代理主键。由hibernate维护一个变量，每次生成主键时自动以递增。
			   	问题：如果有多个应用访问一个数据库，由于每个应用维护自己的主键，所以此时主键可能冲突。建议不采用。
				优点:可以方便跨平台
				缺点:不适合高并发访问
	identity  代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如：mysql的自增主键，oracle不支持主键自动生成。
				如果数据库支持自增建议采用。
				优点:由底层数据库维护，和hibernate无关
				缺点:只能对支持自动增长的数据库有效，例如mysql
	sequence  代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。
				如果数据库支持序列建议采用。
				优点:由底层数据库维护，和hibernate无关
				缺点:数据库必须支持sequence方案例如oracle
	native	    代理主键。根据底层数据库对自动来选择identity、sequence、hilo 
				由于生成主键策略的控制权由hibernate控制，所以不建议采用。
				优点:在项目中如果存在多个数据库时使用
				缺点:效率比较低
	uuid	    代理主键。Hibernate采用128bit位的UUID算法来生成标识符。该算法
				能够在网络环境中生成唯一的字符串标识符。
				此策略可以保证生成主键的唯一性，并且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。
				优点:与数据库无关，方便数据库移植，效率高，不访问数据库就可以直接生成主键值，并且它能保证唯一性。
				缺点:uuid长度大(32位),占用空间比较大，对应数据库中类型 char  varchar
	assigned  自然主键。由java程序负责生成标识符。
				不建议采用。
				尽量在操作中避免手动对主键操作
generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid、native等主键生成方式.

	示例:
	@Id
	@GeneratedValues(strategy=StrategyType.INDETITY)
	public int getId() {
	    return id;
	}*/
	@Id // 指定主键
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	
	// 定义数据表(name： 数据表的名称, length:字段长度，nulabel:该字段是否可以为空,unique：表示该字段中的值唯一)
	@Column(name = "c_name", length = 30, nullable = true, unique = true)
	private String name;
	
	/**
	 * 可以选择 
	 * TemporalType.DATA 只有年月日
	 *  TemporalType.TIME 只有小时分钟秒 
	 *  TemporalType.TIMESTAMP有年月日小时分钟秒
	 * 
	 */
	@Temporal(TemporalType.TIMESTAMP) // 定义日期类型， 该类型既有年月日也有十分秒
	private Date publicationDate;// 出版日期

	private Double price;// 价格， 如果没有添加注解，也会自动的在表中生成
	
	// 当表已经创建好以后，其实是不需要@Column的配置，一切以数据自己为准
	@Column(name = "ddd", length = 50, nullable = true, unique = true)
	private String ddd;
	
	@Transient// // 表示该属性只表示不生成在数据表中
	private String msg;
	
	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Date getPublicationDate() {
		return publicationDate;
	}

	public void setPublicationDate(Date publicationDate) {
		this.publicationDate = publicationDate;
	}

	public Double getPrice() {
		return price;
	}

	public void setPrice(Double price) {
		this.price = price;
	}

	public String getDdd() {
		return ddd;
	}

	public void setDdd(String ddd) {
		this.ddd = ddd;
	}

}
